#define _GNU_SOURCE
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>


//不定参宏函数
#define LOG(fmt,...) printf("[%s:%d]" fmt "\n",__FILE__,__LINE__,##__VA_ARGS__)

//C语言不定参函数
void printfNum(int n,...)
{
    va_list ap; //创建一个va_list,里面是一个指针
    va_start(ap,n);   //参数传参是压栈是形式，所有在va_start的时候会让ap指向n后面第一个不定参参数的地址
    for(int i = 0;i<n;i++)
    {
        //va_arg是通过ap指针，对传入不定参参数的类型进行定偏移量，指定偏移量为int
        int num = va_arg(ap,int);   
        printf("%d\n",num);
    }
    va_end(ap); //因为va_list是一个指针，在使用完毕后需要置空，不然会变成野指针
    //va系列的并不是函数，而是宏
}


void myprintf(const char* fmt,...)
{
    va_list ap;
    va_start(ap,fmt);
    char* res;
    //vasprintf函数会通过传入的res的一级指针进行开辟空间，然后对fmt里面的字符进行分析
    //分析到%d等的时候，会使用ap进行偏移，把取出的字符放进res当中
    //因此res在使用完也需要进行free释放
    int ret = vasprintf(&res,fmt,ap);   
    if(ret != -1)
    {
        printf("%s",res);
        free(res);
    }
    va_end(ap);
}

int main()
{
    printf("[%s:%d] %s-%d\n",__FILE__,__LINE__,"c语言",666);
    LOG("%s-%d-%d","c语言",666,111);
    LOG("%s","hello world");

    printfNum(5,1,2,3,4,5);

    myprintf("%s-%d\n","hello world",666);
    myprintf("你好，世界！\n");
    return 0;
}